'''
程序目的：实现问题清单数据的展示

实现模块：
    一、数据的输入和整理： 得出各类数据，以列表的形式存储
        1、pandas数据导入
         导入excel数据
          数据清理
        2、pandas 数据筛选
    二、数据展示：使用列表数据，并进行绘制

'''

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

def ProblemDataShow():

    '''1、数据的输入和整理： 得出各类数据，以列表的形式存储 '''
    #  1-1 数据的导入和清理
    ProblemList = pd.read_excel("D:\\5.大众品牌周报\\输出材料\\问题管理数据.xlsx")
    ProblemList.drop(["前端-探岳-黄灯", "前端-探岳-绿灯", "前端-Coupe-黄灯", "前端-Coupe-绿灯", \
                      "后端-探岳-黄灯", "后端-探岳-绿灯", "后端-Coupe-黄灯", "后端-Coupe-绿灯", \
                      "车门-探岳-黄灯", "车门-探岳-绿灯", "车门-Coupe-黄灯", "车门-Coupe-绿灯", \
                      "内饰-探岳-黄灯", "内饰-探岳-绿灯", "内饰-Coupe-黄灯", "内饰-Coupe-绿灯", \
                      "月份"], axis=1, inplace=True)
    # print(ProblemList)
    print("****************************")

    #  1-2数据的选取
    X = ProblemList['周序号']
    X_ZhouName = ProblemList['周名称']
    Y_Yellow = ProblemList['黄灯']
    Y_Green = ProblemList['绿灯']
    Y_Jiejuelv = ProblemList['解决率']
    Y_JiejuelvGoal = ProblemList['解决率目标']

    # print(X)
    # print(X_ZhouName)
    # print(Y_Yellow)
    # print(Y_Green)
    # print(Y_Jiejuelv)
    # print(Y_JiejuelvGoal)

    '''2、数据展示：使用列表数据，并进行绘制 '''

    # 2-1  基础设置：创建绘图区域，设置范围
    #   2-1-1创建双轴
    fig, ax1 = plt.subplots(figsize=(7,3.5)) # 设置图片大小
    ax2 = ax1.twinx()

    #   2-1-2设置x/y轴刻度范围
    x_min = 1
    x_max = 26

    #       2-1-2-1 使用代数规定Y周范围，是为了使双轴同步，使用的事左右轴相对0值等比例的关系
    y1_max = 30
    y1_min = -5
    y2_max = 1 #注意此处若更改，需要检查2-1-4中 ax2的设置。原因：此处的设置是为了双轴同步，当2-1-4中的标签范围超出此处规定的范围是，此处设置将失效
    y2_min =y1_min*y2_max/y1_max


    ax1.axis([x_min, x_max, y1_min, y1_max]) #前两位为X轴范围，后两位为Y轴范围
    ax2.axis([x_min, x_max, y2_min, y2_max]) #前两位为X轴范围，后两位为Y轴范围




    #   2-1-3 x轴 标签设置

    ax1.spines['bottom'].set_position(('data',0))#目的：避免字体选装后超出显示边界
    ax1.set_xticks(X)
    ax1.set_xticklabels(X_ZhouName,fontsize=9,color = 'k',rotation = -90) #fontsize 字体大小；rotation字体旋转



    #   2-1-4 y轴 标签设置
    ax1.set_yticks([0,10,20,y1_max])

    ax2.set_yticks([0,0.2,0.4,0.6,0.8,1])
    ax2.set_yticklabels(["0", "20%", "40%", "60%", "80%", "100%"])

    #   2-1-5 顶部边框，不使用，设置为无色
    ax1.spines['top'].set_color("none")
    ax2.spines['top'].set_color("none")

    ax2.spines['bottom'].set_color("none")


    # 2-2   问题黄灯、绿灯柱状图绘制*********************************
    #   2-2-1 绘制柱
    ax1.bar(X, Y_Green, color="lime")
    ax1.bar(X, Y_Yellow, bottom=Y_Green, color="yellow")

    #   2-2-2 添加标签
    for x, y in zip(X, Y_Green):
        if y == y:  # 作用是判断y是不是nan，原理没理解，来源：https://blog.csdn.net/frankiehello/article/details/79459645
            ax1.text(x, y / 2 - 0.4, int(y), ha='center', va='baseline',color = 'dimgrey',fontsize = 8)

    for x, y_green, y_yellow in zip(X, Y_Green, Y_Yellow):
        if y_yellow == y_yellow:  # 作用是判断y是不是nan，原理没理解，来源：https://blog.csdn.net/frankiehello/article/details/79459645
            ax1.text(x, y_green + y_yellow / 2, int(y_yellow), ha='center', va='baseline',color = 'dimgrey',fontsize = 8)

    # 2-3 问题解决率
    #   2-3-1 绘制图形（解决率+目标）
    ax2.plot(X, Y_Jiejuelv)
    # ax2.plot(X, Y_JiejuelvGoal)

    # ax2.ylim((0,1))
    #   2-3-2 添加标签
    for x, y in zip(X, Y_Jiejuelv):
        if y == 0: #特殊显示：KW02周解决率为0，直接显示为0，减少空间占用
            ax2.text(x, y + 0.02, 0, ha='center', va='baseline', color='k', fontsize='9')
        else:
            # fontweight 是加粗效果
            ax2.text(x, y + 0.02, format(y, '.1%'), ha='center', va='baseline',color = 'k',fontsize ='9',fontweight = 560)

    plt.show()
